
Bienvenue dans cette aventure passionnante où tu vas créer ta première IA ! L'objectif n'est pas de rivaliser avec ChatGPT ou Elon Musk, mais de découvrir le monde fascinant de l'intelligence artificielle.
Nous aurons deux projets distincts. Nous commencerons par créer un système de chat, puis nous créerons un système d'analyse d'image capable de prédire l'objet principal de l'image.
Il s'agit d'un petit programme qui vous demande de lui poser une question. Ensuite, il va chercher dans sa base de données selon un système moyennement complexe qui découpe la phrase en mots clés. En utilisant ces mots clés, il tente de trouver la réponse la plus pertinente possible.
Comment fonctionne la prédiction dans PyChat ?
Pour comprendre le fonctionnement du chat, tu trouveras plus loin dans ce tutoriel un scénario dont le but est de poser des questions et de nous faire un retour sur des réflexions telles que : la réponse est-elle pertinente ? Le système apprend-il ? Enfin, comment le système pourrait-il s'améliorer ?
N'oublie pas que l'idéal est que tu te forges ta propre vision et compréhension.
Prêt à commencer ? Allons-y ! 💪
Idéalement les tutoriels python ont été réalisés.
De plus, la programmation étant un long voyage, semblable à l'apprentissage d'une langue 🌍, il faut d'abord maîtriser les bases, comme les mots, la grammaire, et les différents sons 🗣️.
Avec le temps, nous formerons des phrases, et avec encore plus de pratique, nous comprendrons leur sens 🧠.
Puis, en saisissant les nuances 🧐, nous pourrons apprécier les blagues culturelles 🎭.
Un jour, un homme africain part à la chasse. Après une longue journée dans la savane, il rentre à la maison les mains vides. Sa femme lui demande :
« Chéri, où est le gibier ? »
L'homme répond : « Aujourd'hui j'ai attrapé quelque chose de plus précieux qu'un simple animal... j'ai attrapé de l'expérience ! »
Ici, nous sommes au début, donc pas le temps de tout faire nous-mêmes. Je te propose donc une petite exploration des bibliothèques que nous utiliserons dans ce tutoriel pour comprendre les composants essentiels de notre système 🧩.
import nltk : Pour le traitement du langage naturel, notamment le tokenizer punkt pour diviser le texte en mots et phrases.from sklearn.feature_extraction.text import CountVectorizer : Convertit le texte en une matrice de comptage des mots pour l'entraînement des modèles.from sklearn.naive_bayes import MultinomialNB : Algorithme de classification basé sur le théorème de Bayes, adapté aux données textuelles.import json : Manipule les fichiers JSON pour charger et sauvegarder les données d'entraînement.import joblib : Sérialise les objets Python pour sauvegarder et charger les modèles d'apprentissage automatique.import string : Fournit des outils pour manipuler les chaînes de caractères, comme supprimer la ponctuation.certifi==2024.7.4
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
filelock==3.15.4
fsspec==2024.6.1
huggingface-hub==0.24.5
idna==3.7
Jinja2==3.1.4
joblib==1.4.2
MarkupSafe==2.1.5
mpmath==1.3.0
networkx==3.3
nltk==3.8.1
numpy==2.0.1
packaging==24.1
PyYAML==6.0.2
regex==2024.7.24
requests==2.32.3
safetensors==0.4.4
scikit-learn==1.5.1
scipy==1.14.0
setuptools==72.2.0
sympy==1.13.2
threadpoolctl==3.5.0
tokenizers==0.19.1
torch==2.4.0
tqdm==4.66.5
transformers==4.44.0
typing_extensions==4.12.2
urllib3==2.2.2
wheel==0.44.0
requirements.txt contenant toutes les dépendances nécessaires pour ton projet. Pour installer ces dépendances, exécute la commande suivante :python -m pip install -r requirements.txt
Ensuite, copie-colle le code suivant dans un fichier Python :
import nltk
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
import json
import joblib
import string
import sys
import io
# Assurer que la sortie standard utilise l'encodage UTF-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# Télécharger les ressources nécessaires de NLTK
nltk.download('punkt')
# Fonction de prétraitement du texte
def preprocess_text(text):
text = text.lower() # Conversion en minuscules
text = text.translate(str.maketrans('', '', string.punctuation)) # Suppression de la ponctuation
return text
# Charger les données d'apprentissage depuis un fichier
def load_data(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data["questions"], data["responses"]
# Sauvegarder les données d'apprentissage dans un fichier
def save_data(file_path, questions, responses):
data = {"questions": questions, "responses": responses}
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
def save_model(file_path, model, vectorizer):
joblib.dump((model, vectorizer), file_path)
def load_model(file_path):
return joblib.load(file_path)
# Fonction pour entraîner le modèle de réponse
def train_response_model(questions, responses):
vectorizer = CountVectorizer()
X = vectorizer.fit_transform([preprocess_text(question) for question in questions])
model = MultinomialNB()
model.fit(X, responses)
return model, vectorizer
# Initialisation
data_file_path = "data.json"
model_path = "response_model.pkl"
# Charger les données
questions, responses = load_data(data_file_path)
# Entraîner ou charger le modèle
try:
model, vectorizer = load_model(model_path)
except FileNotFoundError:
model, vectorizer = train_response_model(questions, responses)
save_model(model_path, model, vectorizer)
def predict_response(question):
question = preprocess_text(question)
X = vectorizer.transform([question])
prediction = model.predict(X)[0]
return prediction
def main():
while True:
try:
question = input("Posez-moi une question: ")
# Trouver la réponse correspondant à la question
response = predict_response(question)
print(f"Réponse: {response}")
feedback = input("Est-ce que la réponse est correcte? (oui/non) ").strip().lower()
if feedback == "non":
correct_response = input("Quelle devrait être la bonne réponse? ").strip()
questions.append(question)
responses.append(correct_response)
# Réentraîner le modèle avec les nouvelles données
global model, vectorizer
model, vectorizer = train_response_model(questions, responses)
save_data(data_file_path, questions, responses)
save_model(model_path, model, vectorizer)
print("Merci pour le retour, j'ai appris quelque chose de nouveau!")
elif feedback == "oui":
print("Merci pour votre confirmation!")
else:
print("Réponse non reconnue. Veuillez répondre par 'oui' ou 'non'.")
except KeyboardInterrupt:
print("\nProgramme terminé.")
break
except Exception as e:
print(f"Une erreur est survenue: {e}")
if __name__ == "__main__":
main()
Complète le projet en ajoutant les fichiers manquant présents dans l'archive suivante
Exécute la commande suivante :
python pysChat.py
Suis les instructions à l'écran pour interagir avec le système de chat.

Super, nous avons terminé le programme ! 🎉 Il est maintenant temps de le tester et d'en tirer des conclusions. 🧩
Pour cela, comme indiqué plus haut, nous allons mettre en place un scénario de test. Comme cela peut être nouveau pour vous, je vais vous guider tout au long du processus. 👨🏫
Le protocole consiste simplement à poser des questions au programme et à indiquer si les réponses sont pertinentes ou non. 🤔✅❌
Ci-dessous se trouve une série de questions simples, sans lien entre elles. votre tâche est de déterminer si chaque réponse proposée est correcte ou non.
À votre avis, pourquoi cette réponse pourrait-elle être incorrecte ?
après avoir exécuté ces scénarios de test, vous devez :
l'objectif est d'observer l'amélioration progressive du système, qui ne fonctionne pas parfaitement au départ.
import nltk
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
import json
import joblib
import string
import sys
import io
# Assurer que la sortie standard utilise l'encodage UTF-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
import nltk : Charge la bibliothèque Natural Language Toolkit pour le traitement du langage naturel.from sklearn.feature_extraction.text import CountVectorizer : Importation de CountVectorizer pour convertir les textes en matrices de fréquence de mots.from sklearn.naive_bayes import MultinomialNB : Importation de l'algorithme de classification Naïve Bayes pour l'apprentissage automatique.import json : Permet la manipulation des fichiers JSON pour charger et sauvegarder les données.import joblib : Utilisé pour la sérialisation des objets Python, comme les modèles d'apprentissage automatique.import string : Fournit des outils pour la manipulation de chaînes de caractères, comme la suppression de la ponctuation.import sys et import io : Pour configurer l'encodage UTF-8 de la sortie standard.# Télécharger les ressources nécessaires de NLTK
nltk.download('punkt')
# Fonction de prétraitement du texte
def preprocess_text(text):
text = text.lower() # Conversion en minuscules
text = text.translate(str.maketrans('', '', string.punctuation)) # Suppression de la ponctuation
return text
nltk.download('punkt') : Télécharge le tokenizer punkt de NLTK pour diviser le texte en mots et phrases.preprocess_text : Fonction pour normaliser le texte en le convertissant en minuscules et en supprimant la ponctuation.# Charger les données d'apprentissage depuis un fichier
def load_data(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data["questions"], data["responses"]
# Sauvegarder les données d'apprentissage dans un fichier
def save_data(file_path, questions, responses):
data = {"questions": questions, "responses": responses}
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
load_data : Charge les questions et réponses depuis un fichier JSON.save_data : Sauvegarde les questions et réponses dans un fichier JSON.def save_model(file_path, model, vectorizer):
joblib.dump((model, vectorizer), file_path)
def load_model(file_path):
return joblib.load(file_path)
save_model : Sauvegarde le modèle et le vecteur de caractéristiques dans un fichier avec joblib.load_model : Charge le modèle et le vecteur de caractéristiques depuis un fichier.# Fonction pour entraîner le modèle de réponse
def train_response_model(questions, responses):
vectorizer = CountVectorizer()
X = vectorizer.fit_transform([preprocess_text(question) for question in questions])
model = MultinomialNB()
model.fit(X, responses)
return model, vectorizer
train_response_model : Entraîne un modèle de classification Naïve Bayes pour prédire les réponses basées sur les questions. Utilise CountVectorizer pour transformer le texte en une matrice de fréquences de mots, puis entraîne le modèle avec ces données.# Initialisation
data_file_path = "data.json"
model_path = "response_model.pkl"
# Charger les données
questions, responses = load_data(data_file_path)
# Entraîner ou charger le modèle
try:
model, vectorizer = load_model(model_path)
except FileNotFoundError:
model, vectorizer = train_response_model(questions, responses)
save_model(model_path, model, vectorizer)
def predict_response(question):
question = preprocess_text(question)
X = vectorizer.transform([question])
prediction = model.predict(X)[0]
return prediction
def main():
while True:
try:
question = input("Posez-moi une question: ")
# Trouver la réponse correspondant à la question
response = predict_response(question)
print(f"Réponse: {response}")
feedback = input("Est-ce que la réponse est correcte? (oui/non) ").strip().lower()
if feedback == "non":
correct_response = input("Quelle devrait être la bonne réponse? ").strip()
questions.append(question)
responses.append(correct_response)
# Réentraîner le modèle avec les nouvelles données
global model, vectorizer
model, vectorizer = train_response_model(questions, responses)
save_data(data_file_path, questions, responses)
save_model(model_path, model, vectorizer)
print("Merci pour le retour, j'ai appris quelque chose de nouveau!")
elif feedback == "oui":
print("Merci pour votre confirmation!")
else:
print("Réponse non reconnue. Veuillez répondre par 'oui' ou 'non'.")
except KeyboardInterrupt:
print("\nProgramme terminé.")
break
except Exception as e:
print(f"Une erreur est survenue: {e}")
if __name__ == "__main__":
main()
predict_response : Prépare la question, transforme le texte en une matrice de caractéristiques, et prédit la réponse en utilisant le modèle.main : Fonction principale qui boucle pour prendre des questions de l'utilisateur, fournir des réponses, et gérer les retours de feedback pour améliorer le modèle.